#region copyright
/*
* Copyright (c) 2008, Dion Kurczek
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright
*       notice, this list of conditions and the following disclaimer in the
*       documentation and/or other materials provided with the distribution.
*     * Neither the name of the <organization> nor the
*       names of its contributors may be used to endorse or promote products
*       derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY DION KURCZEK ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL DION KURCZEK BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace SCG.TurboSprite
{
    public class BitmapSprite : Sprite
    {
        //Private fields
        private Bitmap _bitmap;           

        //Constructor - Bitmap must be supplied
        public BitmapSprite(Bitmap bitmap)
        {
            Bitmap = bitmap;          
        }

        //Render it on the sprite surface
        public override void Render(Graphics g)
        {
            g.DrawImage(Bitmap, X - WidthHalf - Surface.OffsetX, Y - HeightHalf - Surface.OffsetY);
        }

        //The bitmap used to render the sprite
        public Bitmap Bitmap
        {
            get
            {
                return _bitmap;
            }
            set
            {
                if (value != null)
                {
                    if (_cache.ContainsKey(value))
                        _bitmap = _cache[value];
                    else
                    {
                        _bitmap = new Bitmap(value.Width, value.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
                        Graphics gr = Graphics.FromImage(_bitmap);
                        using (gr)
                        {
                            Rectangle bounds = new Rectangle(0, 0, value.Width, value.Height);
                            gr.DrawImage(value, bounds, bounds, GraphicsUnit.Pixel);
                        }
                        _cache[value] = _bitmap;
                    }
                    Shape = new RectangleF(-_bitmap.Width / 2, -_bitmap.Height / 2, _bitmap.Width, _bitmap.Height);
                }
                else
                    _bitmap = null;
            }
        }

        //Cache our formated Bitmaps for re-use
        public Dictionary<Bitmap, Bitmap> _cache = new Dictionary<Bitmap, Bitmap>();
    }
}
